package com.xiao.bargain.service.impl;

import com.xiao.bargain.entity.BarginEntity;
import com.xiao.bargain.entity.NoteMqEntity;
import com.xiao.bargain.feign.AdminFeign;
import com.xiao.bargain.feign.OrderFeign;
import com.xiao.bargain.service.BarginService;
import com.xiao.bargain.utils.SnowFlake;
import com.xiao.group.common.Vo.OrderEntity;
import com.xiao.group.common.Vo.UsersEntity;
import com.xiao.group.common.utils.R;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiao.group.common.utils.PageUtils;
import com.xiao.group.common.utils.Query;

import com.xiao.bargain.dao.BarginHuodongDao;
import com.xiao.bargain.entity.BarginHuodongEntity;
import com.xiao.bargain.service.BarginHuodongService;
import org.springframework.transaction.annotation.Transactional;


@Service("barginHuodongService")
public class
BarginHuodongServiceImpl extends ServiceImpl<BarginHuodongDao, BarginHuodongEntity> implements BarginHuodongService {

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @Autowired
    RabbitTemplate rabbitTemplate;
    @Autowired
    BarginService barginService;

    @Autowired
    AdminFeign adminFeign;
    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<BarginHuodongEntity> page = this.page(
                new Query<BarginHuodongEntity>().getPage(params),
                new QueryWrapper<BarginHuodongEntity>()
        );

        return new PageUtils(page);
    }

    @Override
    public Integer tohd(Integer barinId, Integer userId) {
//获取用户信息
        UsersEntity usersEntity = adminFeign.info(userId);
//获取砍价的信息
        BarginEntity barginEntity = barginService.getById(barinId);
        UUID uuid = UUID.randomUUID();
        Long ids = SnowFlake.ids();
        long time = barginEntity.getStartTime().getTime();
        long time1 = barginEntity.getJendTime().getTime();
        BarginHuodongEntity barginHuodongEntity = new BarginHuodongEntity();
        barginHuodongEntity.setGoodsImg(barginEntity.getGoodsImg());
        barginHuodongEntity.setUserid(userId);
        barginHuodongEntity.setBarginId(barinId);
        barginHuodongEntity.setGoodsId(barginEntity.getGoodsId());
        barginHuodongEntity.setXianshiStatis("0");
        barginHuodongEntity.setWeiyi(uuid.toString());
        barginHuodongEntity.setKaituanWeiyi(1);
        barginHuodongEntity.setUserName(usersEntity.getUsername());
        barginHuodongEntity.setGoodsName(barginEntity.getGoodsName());
        barginHuodongEntity.setMoveStatus(1);
        barginHuodongEntity.setInforma(barginEntity.getInfomation());
        barginHuodongEntity.setGoodsPrice(barginEntity.getGoodsPrice());
        barginHuodongEntity.setStartTime(barginEntity.getStartTime());
        barginHuodongEntity.setJendTime(barginEntity.getJendTime());
        if(barginEntity.getKanroots() == 1){
            barginHuodongEntity.setKancount(barginEntity.getBarginRenshu());
            barginHuodongEntity.setYukan(barginEntity.getGoodsPrice() - barginEntity.getGoodsDijia());
        }
        if(barginEntity.getKanroots() == 2) {
            barginHuodongEntity.setKanmax(barginEntity.getBarginMoney());
        }
        String s = stringRedisTemplate.opsForValue().get(barinId.toString());
        String s1 = stringRedisTemplate.opsForValue().get(userId.toString());

        return 0;
    }

    @Override
    public BarginHuodongEntity info(Integer barinId, Integer userId) {
        BarginHuodongEntity barginHuodongEntity = baseMapper.selectOne(new QueryWrapper<BarginHuodongEntity>().eq("userid",userId).eq("bargin_id",barinId));
        if(barginHuodongEntity.getUserid() == userId){
           return barginHuodongEntity;
        }
        return null;
    }

    @Autowired
    OrderFeign orderFeign;
    @Override
    @Transactional
    public R tobargain(Integer mid, Integer userId) {
        //用户 参与砍价 判断 砍价的规则
        BarginHuodongEntity barginHuodongEntity = this.getById(mid); //获取 发起砍价记录

        UsersEntity usersEntity = adminFeign.info(userId);

        BarginHuodongEntity huodongEntity = new BarginHuodongEntity();

        BarginEntity barginEntity = barginService.getById(barginHuodongEntity.getBarginId()); //发布的砍价信息
        //判断 砍价的规则
        Random random = new Random();
        if(barginEntity.getKanroots() ==1){
            //获取 多少人 要看砍价 多少钱2
            Integer kancount = barginHuodongEntity.getKancount();  //要砍价的人数
            Integer knayuyue = barginHuodongEntity.getKnayuyue(); //剩余的砍价余额
            if(kancount==1){
                //看完这一刀 就结束了 砍价成功修改砍价的状态
                barginHuodongEntity.setKancount(1);
                barginHuodongEntity.setYukan(knayuyue);
                huodongEntity.setKancount(1);
                huodongEntity.setYukan(knayuyue);
                barginHuodongEntity.setXianshiStatis("1");
                //砍完后去支付
                barginEntity.setBuystatus(2);
                //修改最后一次的状态
                boolean b = barginService.updateById(barginEntity);
                //创建未支付订单
                OrderEntity orderEntity = new OrderEntity();
                orderEntity.setAdminId(barginHuodongEntity.getUserid()); //用户id
                orderEntity.setCreateTime(new Date());
                orderEntity.setGoodsCount(1);
                orderEntity.setGoodsId(barginEntity.getGoodsId());
                orderEntity.setUserName(barginHuodongEntity.getUserName());
                orderEntity.setGoodsPrice(Double.parseDouble(barginEntity.getGoodsPrice().toString()));
                orderEntity.setGoodsName(barginEntity.getGoodsName());
                orderFeign.save(orderEntity);
                //创建成功订单之后 发送短信验证码通知 用户
                NoteMqEntity noteMqEntity = new NoteMqEntity();
                noteMqEntity.setUserId(barginHuodongEntity.getUserid());
                noteMqEntity.setBargainId(barginEntity.getBarginId());
                rabbitTemplate.convertAndSend("1901anote",noteMqEntity);
            }else if (kancount >=2){
                //看完这一刀 还没有结束
                Integer yuyue = knayuyue/kancount;
                int i = random.nextInt(yuyue);
                huodongEntity.setKancount(1);
                huodongEntity.setYukan(i);
                barginHuodongEntity.setKancount(barginHuodongEntity.getKancount()-1);
                barginHuodongEntity.setYukan(knayuyue-i);
            }

            //砍过一次后 减去 要 砍的人数-1
            //砍过一次后 剩余的砍价余额
            baseMapper.updateById(barginHuodongEntity);

        }else{
            int i = random.nextInt(barginHuodongEntity.getKanmax());
            huodongEntity.setKnayuyue(i);

        }

        huodongEntity.setGoodsImg(barginHuodongEntity.getGoodsImg());
        huodongEntity.setUserid(userId);
        huodongEntity.setBarginId(barginHuodongEntity.getBarginId());
        huodongEntity.setGoodsId(barginHuodongEntity.getGoodsId());
        huodongEntity.setXianshiStatis(barginHuodongEntity.getXianshiStatis());
        //参与砍价的 状态
        huodongEntity.setMoveStatus(0);
        huodongEntity.setGoodsName(barginHuodongEntity.getGoodsName());
        huodongEntity.setGoodsPrice(barginHuodongEntity.getGoodsPrice());
        huodongEntity.setStartTime(barginHuodongEntity.getStartTime());
        huodongEntity.setJendTime(barginHuodongEntity.getJendTime());
        huodongEntity.setUserName(usersEntity.getUsername());
        huodongEntity.setKaituanWeiyi(barginHuodongEntity.getKaituanWeiyi());
        huodongEntity.setInforma(barginHuodongEntity.getInforma());
        huodongEntity.setWeiyi(barginHuodongEntity.getWeiyi());
        int insert = baseMapper.insert(huodongEntity);
        return R.ok().put("data",insert).put("datalist",barginHuodongEntity);
    }

    @Override
    public R testbar(Integer barinId, Integer userId) {
        return null;
    }

    @Override
    public R infoss(Integer barinId, Integer userId) {
        BarginHuodongEntity barginHuodongEntity = this.getById(barinId);
        //判断 活动表 记录中的用户 是否是 当前登陆状态下 砍价的用户,避免多次砍价
        String weiyi = barginHuodongEntity.getWeiyi();
        List<BarginHuodongEntity> huodongEntityList = baseMapper.selectList(new QueryWrapper<BarginHuodongEntity>().eq("weiyi", weiyi));
        for (BarginHuodongEntity huodongEntity : huodongEntityList) {
            if (huodongEntity.getUserid() == userId) {
                return R.ok().put("data", huodongEntity);
            }
        }
        return R.ok().error().put("data",0);
    }

}